package com.drivers.user.service.impl;

import com.drivers.model.user.CountMoney;
import com.drivers.model.user.FindId;
import com.drivers.model.user.Login;
import com.drivers.model.user.User;
import com.drivers.user.mapper.UserMapper;
import com.drivers.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;


 /**
 * 根据用户ID查找用户信息
 * 此方法不仅返回基本的用户信息，还会附加用户的总资产和月收入信息
 *
 * @param id 用户ID，用于标识特定的用户
 * @return 返回包含用户基本信息、总资产和月收入的User对象
 */
 @Override
public User findUser(Integer id) {
    // 通过用户ID查询用户基本信息
    User user= userMapper.findUser(id);
    // 获取用户的ID，用于查询用户的资产和收入信息
    Integer sid = user.getId();
    // 查询用户的总资产信息
    String assets = userMapper.findAssets(sid);
    // 查询用户的月收入信息
    String income = userMapper.findIncome(sid);
    // 设置用户的总资产信息
    user.setDriverTotalAssets(assets);
    // 设置用户的月收入信息
    user.setDriverMonthIncome(income);
    //查询用户当月的提现记录
    Integer count= userMapper.countAssets(sid);
    //设置用户当月提现记录总额
    user.setCurrentMonth(count);
    // 返回包含详细信息的用户对象
    return user;
}


    /**
     * 更新指定用户的积分
     *
     * @param driverPoint 新的积分值，用于更新用户的积分
     * @param id 用户的ID，用于定位到需要更新积分的特定用户
     *
     * 此方法通过调用userMapper的updatePoint方法，实现对数据库中指定用户积分信息的更新
     * 体现了服务层对数据访问层的调用，以及对业务逻辑中积分更新操作的封装
     */
    @Override
    public void updatePoint(Integer driverPoint, Integer id) {
        userMapper.updatePoint(driverPoint, id);
    }

    /**
     * 根据用户名查询用户信息以进行登录验证
     *
     * @param username 用户名
     * @return 返回查询到的用户信息，如果用户不存在，则返回null
     */
    @Override
    public User loginName(String username) {
        User user = userMapper.loginName(username);
        return user;
    }

    /**
     * 根据用户ID和密码进行登录验证
     * 此方法将用户ID和密码传递给数据库，以验证是否匹配现有用户记录
     *
     * @param id     用户ID，用于唯一标识用户
     * @param password     用户密码，用于验证用户身份
     * @return 返回影响的行数，用于判断登录是否成功
     */
    @Override
    public int loginPassword(Integer id, String password) {
        // 创建一个新的Login对象，用于封装登录信息
        Login login=new Login();
        // 设置用户ID
        login.setId(id);
        // 设置用户密码
        login.setPassword(password);
        // 调用userMapper的loginPassword方法，传递Login对象，返回验证结果
        int i= userMapper.loginPassword(login);
        // 返回登录结果
        return i;
    }

    /**
     * 用户注册方法
     *
     * @param user 待注册的用户对象，包含用户信息
     * @return 返回注册后的用户对象，此处返回null，表示注册失败或尚未实现
     *
     * 注意：本方法尚未实现具体的注册逻辑，只是声明了方法签名
     */
    @Override
    public void userRegister(User user) {
        //读取当前日期
        LocalDate currentDate = LocalDate.now();
        // 获取用户生日
        LocalDate birthday=user.getBirthday();

        //计算当前年份和出生年份
        int currentYear = currentDate.getYear();
        int brithYear = birthday.getYear();

        //根据年份计算年龄
        int age = currentYear - brithYear;
        user.setAge(age);

        //默认司机用户
        user.setDriverPoint(0);
        userMapper.userInsertAttribute(user);

        Integer id= userMapper.userSelectID(user.getDriverPhone());
        userMapper.userInsertProperty(id);
        Login login=new Login();
        login.setId(id);
        login.setPassword(user.getPassword());
        Date date = new Date();
        login.setTime(date);
        userMapper.userInsertRecord(login);
    }
    /**
     * 更新资产数量
     *
     * @param id 资产ID，用于标识需要更新数量的资产
     * @return 更新操作影响的行数，用于判断更新操作是否成功
     */
    @Override
    public int updateAssetsQuan(Integer id) {
        // 调用userMapper的updateAssetsQuan方法，传入id参数，返回影响的行数
        int i = userMapper.updateAssetsQuan(id);
        return i;
    }

    /**
     * 更新用户资产ID关联的信息
     *
     * @param assets 需要更新的资产金额
     * @param id 用户ID
     * @return 更新操作的影响行数
     */
    @Override
    public int updateAssetsId(Integer assets, Integer id) {
        // 创建User对象，准备进行资产信息的更新
        User user = new User();
        user.setId(id); // 设置用户ID

        // 查询用户的总资产信息
        String totalAssets = userMapper.findAssets(id);
        // 计算更新后的资产金额
        Integer money = Integer.parseInt(totalAssets) - assets;
        // 将计算后的资产金额转换为字符串并设置到用户对象中
        user.setDriverTotalAssets(Integer.toString(money));

        // 调用Mapper更新用户资产信息，并获取影响的行数
        int i = userMapper.updateAssetsId(user);
        // 返回更新操作的影响行数
        return i;
    }

    @Override
    public List<CountMoney> findCountMoney(Integer id) {
        // 查询用户的总资产信息
        String totalAssets = userMapper.findAssets(id);
        FindId findId=new FindId();
        findId.setId(id);
        findId.setAttId(Integer.parseInt(totalAssets));
        userMapper.InsertWithdrawal(findId);
        return userMapper.findCountMoney(id);
    }

    @Override
    public CountMoney findByIdCountMoney(FindId id) {
        userMapper.InsertWithdrawal(id);
        return userMapper.findByIdCountMoney(id);
    }

    @Override
    public Object findPhone(String phone) {
        return userMapper.findPhone(phone);
    }

    @Override
    public Object findName(String driverName) {
        return userMapper.findName(driverName);
    }


}
